package com.yijiajiao.finance.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期操作
 */
@SuppressWarnings("boxing")
public class DateUtil {

	public final static String YYYY_MM_DD_HH_MM_SS_MS = "yyyy-MM-dd HH:mm:ss.S";

	public final static String YYYY_MM_DD_HH_MM_SS_SS = "yyyy-MM-dd HH:mm:ss:SS";

	public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	
	public final static String YYYY年MM月DD_HH_MM_SS="yyyy年MM月dd日 HH:mm:ss";

	public final static String YYYY_MM_DD = "yyyy-MM-dd";

	public final static String YYYY年MM月DD = "yyyy年MM月dd日";
	
	public final static String YYYY年MM月="yyyy年MM月";

	public final static String YYYYMMDD_HHMMSS = "yyyyMMdd HHmmss";

	public final static String YYYYMMDD = "yyyyMMdd";

	public final static String YYYYMM = "yyyyMM";

	public final static String YYMM = "yyMM";

	public final static String YYYY = "yyyy";


	public DateUtil() {
	}

	/**
	 * 获取指定格式的日期
	 * @param pattern 日期格式
	 */
	public final Date getNow(String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		try {
			return sdf.parse(getNowTime());
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 获取默认格式的日期字符串
	 */
	public static String getNowTime() {
		SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return sdf.format(new GregorianCalendar().getTime());
	}
	/**
	 * 得到指定格式的字符串日期
	 * @param pattern 日期格式
	 */
	public static String getNowTime(String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(new GregorianCalendar().getTime());
	}

	/**
	 * String型转Date型
	 * @param pattern 日期格式
	 */
	public static Date stringToDate(String date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 日期转字符串
	 *@param pattern 日期格式
	 */
	public static String dateToString(Date date , String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/**
	 * 计算两时间的差值
	 * @param status 返回的单位 1:ss 2:mm 3:hh 4:dd 默认返回 ms
	 */
	public static Long calculateDate(Date startDate, Date endDate, int status) {
		Long temp = endDate.getTime() - startDate.getTime();
		switch (status){
			case 1:return (temp/1000);
			case 2:return (temp/1000/60);
			case 3:return (temp/1000/60/60);
			case 4:return (temp/1000/60/60/24);
			default:return temp;
		}
	}

	/**
	 * 比较两个字符串时间的大小
	 *@return date1>date2 -> 1 | date1< date2 -> -1 | date1==date2 ->0
	 */
    public static int compareStringDate(String date1, String date2) {
        DateFormat df = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        try {
            Date start = df.parse(date1);
            Date end = df.parse(date2);
            return start.compareTo(end);
        } catch (Exception exception) {
            exception.printStackTrace();
            return 0;
        }
    }


	/**
	 * 将String型格式化,比如想要将2011-11-11格式化成2011年11月11日,就StringPattern("2011-11-11","yyyy-MM-dd","yyyy年MM月dd日")
	 * @param date  想要格式化的日期
	 * @param newPattern  想要格式化成什么格式
	 */
	public static String stringPattern(String date, String newPattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(newPattern);
		try {
			return sdf.format(new SimpleDateFormat().parse(date));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 时间加减运算
	 * java中对日期的加减操作
	 * gc.add(1,-1)表示年份减一.
	 * gc.add(2,-1)表示月份减一.
	 * gc.add(3.-1)表示周减一.
	 * gc.add(5,-1)表示天减一.
	 * gc.add(10,-1)表示小时减一.
	 * gc.add(12,-1)表示分减一.
	 * gc.add(13,-1)表示秒减一.
	 * GregorianCalendar类的add(int field,int amount)方法表示年月日加减.<br>
	 * field参数表示年,月.日等.<br>
	 * amount参数表示要加减的数量.<br>
	 * @param date Date型日期
	 * @param pattern 日期格式
	 * @param category 运算种类，例如：天之间运算，月之间运算 ,1年,2月,3周,5天
	 * @param number 正数代表加、负数代表减
	 */
	public static String calcDate(Date date, String pattern, int category, int number) {

		return dateToString(calcDate(date, category, number), pattern);
	}
	public static Date calcDate(Date date, int category, int number){
		GregorianCalendar gc = new GregorianCalendar();
		gc.setTime(date);
		gc.add(category, number);
		return gc.getTime();
	}

	/**
	 * 根据日期计算这个星期的星期一是多少，并且星期一以00:00:00开头
	 */
	public String calcMonday(String queryDate) throws ParseException {
		GregorianCalendar gc = new GregorianCalendar();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		gc.setTime(df.parse(queryDate));
		gc.add(5, -1);
		while (gc.get(7) != 1) {
			gc.add(5, -1);
		}
		gc.add(5, 1);
		return df.format(gc.getTime()) + " 00:00:00";
	}

	/**
	 * 根据日期计算这个星期的星期日是多少，并且星期日以23:59:59开头
	 */
	public String calcSunday(String queryDate) throws ParseException {
		String date;
		GregorianCalendar gc = new GregorianCalendar();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		gc.setTime(df.parse(queryDate));
		gc.add(5, -1);
		while (gc.get(7) != 7) {
			gc.add(5, 1);
		}
		gc.add(5, 1);
		date = df.format(gc.getTime()) + " 23:59:59";
		return date;
	}

	/**
	 * 根据日期计算这个月的第一天是几号
	 */
	public static Date calcBeginMonth(String queryDate) {
		GregorianCalendar gc = new GregorianCalendar();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			gc.setTime(df.parse(queryDate));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
		int i = gc.get(Calendar.MONTH);
		// 11表示第12月
		while (gc.get(Calendar.MONTH) != (i == 0 ? 11 : i - 1)) {
			gc.add(5, -1);
		}
		gc.add(5, 1);
		return gc.getTime();
	}

	/**
	 * 根据日期计算这个月的最后一天是几号
	 */
	public static Date calcEndMonth(String queryDate){
		GregorianCalendar gc = new GregorianCalendar();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			gc.setTime(df.parse(queryDate));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
		int i = gc.get(Calendar.MONTH);
		// 11表示第12月
		while (gc.get(Calendar.MONTH) != (i == 11 ? 0 : i + 1)) {
			gc.add(5, 1);
		}
		gc.add(5, -1);
		return gc.getTime();
	}
	/**
	 *	判断所给日期是不是当前月
	 */
	public static boolean checkThisMonth(String date){
		SimpleDateFormat df = new SimpleDateFormat(YYYYMM);
		String receiveDate = stringPattern(date, YYYYMM);
		String da = df.format(new Date());
		return da.equals(receiveDate);
	}
	
	public static int checkLastMonth(String date, String pattern){
		Calendar cal = Calendar.getInstance();
		cal.add(cal.MONTH, -1); 
		Date currentTime=cal.getTime();//当前时间的上个月时间
		SimpleDateFormat sdf=new SimpleDateFormat(pattern);
		String curTime=sdf.format(currentTime);
		System.out.println("上个月的时间为："+curTime);
		if(curTime.equals(date)) return 1;
		return 0;
	}

}
